package com.ruoyi.common.redis.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Wu Yuwei
 * @Description:
 * @date 2022/11/3 23:30
 */
@Component
public class RedisTemplateHashService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 缓存Map
     *
     * @param key
     * @param dataMap
     */
    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
    {
        if (dataMap != null) {
            redisTemplate.opsForHash().putAll(key, dataMap);
        }
    }

    /**
     * 缓存单个Map
     *
     * @param key
     * @param hashKey
     * @param value
     */
    public <T> void putHashKey(final String key, final String hashKey,final T value)
    {
        if (value != null) {
            redisTemplate.opsForHash().put(key, hashKey,value);
        }
    }

    /**
     * 获得缓存的Map
     *
     * @param key
     * @return
     */
    public <T> Map<String, T> getCacheMap(final String key)
    {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 获得缓存的值中 指定可以对应的value
     *
     * @param key
     * @return
     */
    public <T> Object hgetKey(final String key,final String hashKey)
    {
        Object o = redisTemplate.opsForHash().get(key, hashKey);
        return o;
    }

    /**
     * 判断是否有指定的map键值
     * @param key 缓存键值
     * @param hashKey 缓存map中的键值
     * @param <T>
     * @return
     */
    public <T> Boolean hasKey(final String key,final String hashKey)
    {
        return redisTemplate.opsForHash().hasKey(key, hashKey);
    }

    /**
     * 获取变量中的键
     * @param key
     * @param <T>
     * @return
     */
    public <T> Set<T> keys(final String key)
    {
        Set<T> keys = redisTemplate.opsForHash().keys(key);
        return keys;
    }

    /**
     * 以集合的方式获取变量中的值
     * @param key
     * @param hashkeys
     * @return
     */
    public <T> List<T> multiGet(final String key, final Collection<T> hashkeys)
    {
        List<T> list = redisTemplate.opsForHash().multiGet(key, hashkeys);
        return list;
    }

    /**
     * 获取指定变量中的hashMap值
     * @param key
     * @param <T>
     * @return
     */
    public <T> List<T> values(final String key)
    {
        List<T> keys = redisTemplate.opsForHash().values(key);
        return keys;
    }

    /**
     * 使变量中的键以long值的大小进行自增长
     * @param key
     * @param hashkey
     * @param delta
     * @param <T>
     * @return
     */
    public <T> Long increment(final String key,final String hashkey,final Long delta)
    {
        Long increment = redisTemplate.opsForHash().increment(key, hashkey, delta);
        return increment;
    }
}
